#include <my_header.h>
// 传输文件时显示进度条
/* Usage:  */
typedef struct train_s {  
    int len;        // 缓存区的长度  文件名长度
    char buf[1000]; // 缓存区，用于存放文件名   根据指定长度发送文件名
} train_t;  

// 参数: 用来和指定客户端通信的socket的文件描述符  
int sendFile(int net_fd) {  
    train_t file_name; // 声明一个 train_t 类型的变量，用于存放文件名  
    bzero(&file_name, sizeof(file_name)); // 清空 file_name 的内容  

    char *str = "1b.txt"; // 指定要发送的文件名  
    memcpy(file_name.buf, str, strlen(str)); // 将文件名拷贝到缓存区  
    file_name.len = strlen(str); // 设置缓存区的长度 
    // sizeof(int) 文件名长度+ file_name.len 根据文件名长度发送文件名
    send(net_fd, &file_name, sizeof(int) + file_name.len, 0); // 发送文件名给客户端  

    // 打开文件，以只读方式  
    int file_fd = open(str, O_RDONLY);  
    if (file_fd == -1) {  
        perror("打开文件失败"); // 检查文件是否成功打开  
        return -1; // 返回错误码  
    }  

    // 获取文件大小  
    struct stat st;  
    memset(&st, 0, sizeof(st)); // 清空结构体 st  
    fstat(file_fd, &st); // 获取文件的状态信息，包括文件大小  
    //printf("file_size: %ld \n", st.st_size); // 打印文件大小（可选）  
    // 把文件大小发送给客户端  
    send(net_fd, &st.st_size, sizeof(off_t), MSG_NOSIGNAL); // 发送文件大小  

    // 循环读取文件内容并发送  
    while (1) {  
        char buf[1000] = {0}; // 声明一个缓存区，用于读取文件内容  
        int read_num = read(file_fd, buf, sizeof(buf)); // 从文件中读取数据  
        if (read_num == 0) {  
            // 文件读完，跳出循环  
            break;  
        }  

        // 发送读取的字节数  
        int ret = send(net_fd, &read_num, sizeof(int), MSG_NOSIGNAL);   
        if (ret == -1) {  
            // 说明对方断开连接  
            // printf("对方断开链接 \n");  
            break;  
        }  

        // 发送读取的数据  
        ret = send(net_fd, buf, read_num, MSG_NOSIGNAL);   
        if (ret == -1) {  
            // 说明对方断开连接  
            // printf("对方断开链接 \n");  
            break;  
        }  
    }  

    close(file_fd); // 关闭文件描述符  
    return 0; // 返回成功  
}

